/*
 * Summary: incomplete XML Schemas structure implementation
 * Description: interface to the XML Schemas handling and schema validity
 *              checking, it is incomplete right now.
 *
 * Copy: See Copyright for the status of this software.
 *
 * Author: Daniel Veillard
 */


#ifndef __XML_SCHEMA_H__
#define __XML_SCHEMA_H__

#include <libxml/xmlversion.h>

#ifdef LIBXML_SCHEMAS_ENABLED

#include <libxml/tree.h>

#ifdef __cplusplus
extern "C" {
#endif

/**
 * This error codes are obsolete; not used any more.
 */
typedef enum {
    XML_SCHEMAS_ERR_OK        = 0,
    XML_SCHEMAS_ERR_NOROOT    = 1,
    XML_SCHEMAS_ERR_UNDECLAREDELEM,
    XML_SCHEMAS_ERR_NOTTOPLEVEL,
    XML_SCHEMAS_ERR_MISSING,
    XML_SCHEMAS_ERR_WRONGELEM,
    XML_SCHEMAS_ERR_NOTYPE,
    XML_SCHEMAS_ERR_NOROLLBACK,
    XML_SCHEMAS_ERR_ISABSTRACT,
    XML_SCHEMAS_ERR_NOTEMPTY,
    XML_SCHEMAS_ERR_ELEMCONT,
    XML_SCHEMAS_ERR_HAVEDEFAULT,
    XML_SCHEMAS_ERR_NOTNILLABLE,
    XML_SCHEMAS_ERR_EXTRACONTENT,
    XML_SCHEMAS_ERR_INVALIDATTR,
    XML_SCHEMAS_ERR_INVALIDELEM,
    XML_SCHEMAS_ERR_NOTDETERMINIST,
    XML_SCHEMAS_ERR_CONSTRUCT,
    XML_SCHEMAS_ERR_INTERNAL,
    XML_SCHEMAS_ERR_NOTSIMPLE,
    XML_SCHEMAS_ERR_ATTRUNKNOWN,
    XML_SCHEMAS_ERR_ATTRINVALID,
    XML_SCHEMAS_ERR_VALUE,
    XML_SCHEMAS_ERR_FACET,
    XML_SCHEMAS_ERR_,
    XML_SCHEMAS_ERR_XXX
} xmlSchemaValidError;

/*
* ATTENTION: Change xmlSchemaSetValidOptions's check
* for invalid values, if adding to the validation
* options below.
*/
/**
 * xmlSchemaValidOption:
 *
 * This is the set of XML Schema validation options.
 */
typedef enum {
    XML_SCHEMA_VAL_VC_I_CREATE            = 1<<0
    /* Default/fixed: create an attribute node
    * or an element's text node on the instance.
    */
} xmlSchemaValidOption;

/*
    XML_SCHEMA_VAL_XSI_ASSEMBLE            = 1<<1,
    * assemble schemata using
    * xsi:schemaLocation and
    * xsi:noNamespaceSchemaLocation
*/

/**
 * The schemas related types are kept internal
 */
typedef struct _xmlSchema xmlSchema;
typedef xmlSchema *xmlSchemaPtr;

/**
 * xmlSchemaValidityErrorFunc:
 * @ctx: the validation context
 * @msg: the message
 * @...: extra arguments
 *
 * Signature of an error callback from an XSD validation
 */
typedef void (XMLCDECL *xmlSchemaValidityErrorFunc) (void *ctx, const char *msg, ...) LIBXML_ATTR_FORMAT(2,3);

/**
 * xmlSchemaValidityWarningFunc:
 * @ctx: the validation context
 * @msg: the message
 * @...: extra arguments
 *
 * Signature of a warning callback from an XSD validation
 */
typedef void (XMLCDECL *xmlSchemaValidityWarningFunc) (void *ctx, const char *msg, ...) LIBXML_ATTR_FORMAT(2,3);

/**
 * A schemas validation context
 */
typedef struct _xmlSchemaParserCtxt xmlSchemaParserCtxt;
typedef xmlSchemaParserCtxt *xmlSchemaParserCtxtPtr;

typedef struct _xmlSchemaValidCtxt xmlSchemaValidCtxt;
typedef xmlSchemaValidCtxt *xmlSchemaValidCtxtPtr;

/*
 * Interfaces for parsing.
 */
XMLPUBFUN xmlSchemaParserCtxtPtr XMLCALL
        xmlSchemaNewParserCtxt    (const char *URL);
XMLPUBFUN xmlSchemaParserCtxtPtr XMLCALL
        xmlSchemaNewMemParserCtxt    (const char *buffer,
                     int size);
XMLPUBFUN xmlSchemaParserCtxtPtr XMLCALL
        xmlSchemaNewDocParserCtxt    (xmlDocPtr doc);
XMLPUBFUN void XMLCALL
        xmlSchemaFreeParserCtxt    (xmlSchemaParserCtxtPtr ctxt);
XMLPUBFUN void XMLCALL
        xmlSchemaSetParserErrors    (xmlSchemaParserCtxtPtr ctxt,
                     xmlSchemaValidityErrorFunc err,
                     xmlSchemaValidityWarningFunc warn,
                     void *ctx);
XMLPUBFUN void XMLCALL
        xmlSchemaSetParserStructuredErrors(xmlSchemaParserCtxtPtr ctxt,
                     xmlStructuredErrorFunc serror,
                     void *ctx);
XMLPUBFUN int XMLCALL
        xmlSchemaGetParserErrors(xmlSchemaParserCtxtPtr ctxt,
                    xmlSchemaValidityErrorFunc * err,
                    xmlSchemaValidityWarningFunc * warn,
                    void **ctx);
XMLPUBFUN int XMLCALL
        xmlSchemaIsValid    (xmlSchemaValidCtxtPtr ctxt);

XMLPUBFUN xmlSchemaPtr XMLCALL
        xmlSchemaParse        (xmlSchemaParserCtxtPtr ctxt);
XMLPUBFUN void XMLCALL
        xmlSchemaFree        (xmlSchemaPtr schema);
#ifdef LIBXML_OUTPUT_ENABLED
XMLPUBFUN void XMLCALL
        xmlSchemaDump        (FILE *output,
                     xmlSchemaPtr schema);
#endif /* LIBXML_OUTPUT_ENABLED */
/*
 * Interfaces for validating
 */
XMLPUBFUN void XMLCALL
        xmlSchemaSetValidErrors    (xmlSchemaValidCtxtPtr ctxt,
                     xmlSchemaValidityErrorFunc err,
                     xmlSchemaValidityWarningFunc warn,
                     void *ctx);
XMLPUBFUN void XMLCALL
        xmlSchemaSetValidStructuredErrors(xmlSchemaValidCtxtPtr ctxt,
                     xmlStructuredErrorFunc serror,
                     void *ctx);
XMLPUBFUN int XMLCALL
        xmlSchemaGetValidErrors    (xmlSchemaValidCtxtPtr ctxt,
                     xmlSchemaValidityErrorFunc *err,
                     xmlSchemaValidityWarningFunc *warn,
                     void **ctx);
XMLPUBFUN int XMLCALL
        xmlSchemaSetValidOptions    (xmlSchemaValidCtxtPtr ctxt,
                     int options);
XMLPUBFUN int XMLCALL
        xmlSchemaValidCtxtGetOptions(xmlSchemaValidCtxtPtr ctxt);

XMLPUBFUN xmlSchemaValidCtxtPtr XMLCALL
        xmlSchemaNewValidCtxt    (xmlSchemaPtr schema);
XMLPUBFUN void XMLCALL
        xmlSchemaFreeValidCtxt    (xmlSchemaValidCtxtPtr ctxt);
XMLPUBFUN int XMLCALL
        xmlSchemaValidateDoc    (xmlSchemaValidCtxtPtr ctxt,
                     xmlDocPtr instance);
XMLPUBFUN int XMLCALL
            xmlSchemaValidateOneElement (xmlSchemaValidCtxtPtr ctxt,
                             xmlNodePtr elem);
XMLPUBFUN int XMLCALL
        xmlSchemaValidateStream    (xmlSchemaValidCtxtPtr ctxt,
                     xmlParserInputBufferPtr input,
                     xmlCharEncoding enc,
                     xmlSAXHandlerPtr sax,
                     void *user_data);
XMLPUBFUN int XMLCALL
        xmlSchemaValidateFile    (xmlSchemaValidCtxtPtr ctxt,
                     const char * filename,
                     int options);

XMLPUBFUN xmlParserCtxtPtr XMLCALL
        xmlSchemaValidCtxtGetParserCtxt(xmlSchemaValidCtxtPtr ctxt);

/*
 * Interface to insert Schemas SAX validation in a SAX stream
 */
typedef struct _xmlSchemaSAXPlug xmlSchemaSAXPlugStruct;
typedef xmlSchemaSAXPlugStruct *xmlSchemaSAXPlugPtr;

XMLPUBFUN xmlSchemaSAXPlugPtr XMLCALL
            xmlSchemaSAXPlug        (xmlSchemaValidCtxtPtr ctxt,
                     xmlSAXHandlerPtr *sax,
                     void **user_data);
XMLPUBFUN int XMLCALL
            xmlSchemaSAXUnplug        (xmlSchemaSAXPlugPtr plug);
#ifdef __cplusplus
}
#endif

#endif /* LIBXML_SCHEMAS_ENABLED */
#endif /* __XML_SCHEMA_H__ */
